"""
@author: xxw
@file: 01.python异常处理.py
@time: 2023/4/6 9:38
"""

# 遇到错误异常，程序就终止了
# print("start.....")
# fp = open("xxw.txt")
# print("end")

#1、不希望遇到异常就退出
#2、如果遇到异常希望做特殊处理，而不是退出程序

# 常见异常
# NameError
# print(abc)
#
# 缩进的语法错误
# IndentationError
#     print("abc")
#
# IndexError
# lst = [1,2,3]
# print(lst[4])
#
# SyntaxError
# if 1>0::
#     print("ok")
#
# KeyError
# d1 = {"a":1}
# print(d1["b"])
#
# AttributueError
# import random
# random.xxx()
#
# ValueError
# int("abc")
#
# AssertionError
# 测试   断言异常
# num1 = int(input("please input an number:"))
# num2 = int(input("please input an number:"))
# assert num1 > num2

# 异常捕获机制
# try...except...
# 异常发生，不终止程序
# 异常发生，做特殊处理
#
# try:
#     print("start...")
#     fp = open("xxw.txt")
#     print("end..")
# except:
#     print("no such file")
# print("end2...")
#
# # except    可以有多个,匹配到第一个就退出了
# 如果父类异常捕获放到最前面，就会吞噬所有的子类异常的捕获
# 如果捕获的错误异常与触发的错误异常不一致，程序就捕获不到，然后抛出异常
#
try:
    print("start...")
    int("abc")
    s = 100/0
    lst = [1,2,3]
    print(lst[4])

    # 内建异常

# Exception 是很多异常类的父类
except Exception:
    print("this is exception")
except ZeroDivisionError as e:
    print(e)
except ValueError:
    print("hello")
print("process end...")

# else 结构 finally结构
# else 结构 没有任何异常发生的时候执行的
# finally   不管有没有异常，不管异常有没有被捕获，都执行

# try:
#     print("else test...")
# except ValueError:
#     print("value error")
# else:
#     print("else test end...")

# try:
#     print("finally test....")
#     1/0
# except ValueError:
#     print("value error")
# finally:   #无论如何都会执行
#     print("finally end.....")

# 手动抛出异常
# raise 关键字
# raise
# raise 异常类
# raise 异常类(说明信息)
#
# print("raise start.....")
# # raise IndexError
# raise IndexError("超出范围")
# print("end raise....")